''' mbinary
#########################################################################
# File : lcs.py
# Author: mbinary
# Mail: zhuheqin1@gmail.com
# Blog: https://mbinary.xyz
# Github: https://github.com/mbinary
# Created Time: 2018-08-25  12:00
# Description:
#########################################################################
'''

def lcs(a,b):
    '''time: O(mn); space: O(mn)'''
    m,n= len(a),len(b)
    board = [[[] for i in range(n+1)] for i in range(m+1)]
    for i in range(m):
        for j in range(n):
            if a[i]==b[j]:
                board[i+1][j+1] =board[i][j]+[a[i]]
            elif len(board[i][j+1]) < len(board[i+1][j]):
                board[i+1][j+1] = board[i+1][j]
            else :
                board[i+1][j+1] = board[i][1+j]
    return board[m][n]

def lcs2(a,b):
    '''time: O(mn); space: O(m)'''
    m,n= len(a),len(b)
    board = [[] for i in range(n+1)]
    for i in range(m):
        upperLevel = board[0].copy()
        for j in range(n):
            tmp = board[j+1].copy()
            if a[i]==b[j]:
                board[j+1] = upperLevel+[a[i]]
            elif len(board[j+1]) < len(board[j]):
                board[j+1] = board[j].copy() # copy is needed
            upperLevel = tmp
    return board[n]

if __name__ =='__main__':
    a = 'ABCBDAB'
    b = 'BDCABA'
    print('s1:',a)
    print('s2:',b)
    while 1:
        print('lcs:',lcs2(a,b))
        a = input('s1: ')
        b = input('s2: ')
